//
//  MonitorModel.h
//  CocoaAsyncSocketDemo
//
//  Created by 于鹏 on 2017/5/9.
//  Copyright © 2017年 于鹏. All rights reserved.
//

#import <Foundation/Foundation.h>
#define PKG_0x20 0x20 //ECG1数据包，每秒钟一次(有序列号)
#define PKG_0x21 0x21 //ECG2数据包，每秒钟一次(有序列号)
#define PKG_0x22 0x22 //RESP数据包，每秒钟一次(有序列号)
#define PKG_0x0C 0x0C //血氧数据包，每秒钟一次(有序列号)
#define PKG_0x0D 0x0D //血压数据包，每秒钟一次(有序列号)
#define PKG_0x0E 0x0E //体温数据包，每秒钟一次(有序列号)

#define PKG_0x80 0x80 //心电图1 [250]字节
#define PKG_0x81 0x81 //心电图2 [250]
#define PKG_0x82 0x82 //SPO2图 [125]
#define PKG_0x83 0x83 //RESP图 [125]

#define PKG_0x90 0x90 //专家端获取心电图1 [250]字节
#define PKG_0x91 0x91 //专家端获取心电图2 [250]
#define PKG_0x92 0x92 //专家端获取SPO2图 [125]
#define PKG_0x93 0x93 //专家端获取RESP图 [125]

//typedef NS_ENUM(short,PKGTYPE){
// pkg_0x20 = PKG_0x20,
// pkg_0x21 = PKG_0x21,
// pkg_0x22 = PKG_0x22,
// pkg_0x0C = PKG_0x0C,
// pkg_0x0D = PKG_0x0D,
// pkg_0x0E = PKG_0x0E
//};

typedef NS_ENUM(short,PKGTYPE){
    pkg_0x20 = PKG_0x20,
    pkg_0x21 = PKG_0x21,
    pkg_0x22 = PKG_0x22,
    pkg_0x0C = PKG_0x0C,
    pkg_0x0D = PKG_0x0D,
    pkg_0x0E = PKG_0x0E,
    
    //向TCP发送数据类型
    pkg_0x80 = PKG_0x80,
    pkg_0x81 = PKG_0x81,
    pkg_0x82 = PKG_0x82,
    pkg_0x83 = PKG_0x83,
    
    //接收TCP发送的数据类型
    pkg_0x90 = PKG_0x90,
    pkg_0x91 = PKG_0x91,
    pkg_0x92 = PKG_0x92,
    pkg_0x93 = PKG_0x93
};

// ECG1 数据包，类型0x20
/*
 滤波方式:02
 增益02 
 工频抑制00 
 hr心率值               3c00 = 60
 监护仪的报警上限 7800 
 监护仪的报警下限 3200 
 模块测量范围上限 2c01 
 模块测量范围下限 0f00
 st1值 f0d8
 监护仪的报警上限 1400
 监护仪的报警下限 ecff
 模块测量范围上限 c800
 模块测量范围下限 38ff
st2 值 f0d8
 监护仪的报警上限 1400
 监护仪的报警下限 ecff
 模块测量范围上限 c800
 模块测量范围下限 38ff
 pvc值:9cff
 监护仪的报警上限 0a00
 模块测量范围    6400
 错误代码(当erro=0 时，值才有意义) 00
 sound_status 01 
 心律失常代码 00
 波长:818282 83838484 86868787 88888989 89898989 88878685 82817e7d 7b7a7878 77767574 73737272 73737374 74757575 76767777 78787878 7979797a 7b7b7c7c 7c7c7c7c 7c7d7d7d 7d7d7e7e 7e7e7e7e 7f7f8080 80808080 80808080 80808181 81818181 81818181 81818181 81818080 81818282 82828281 81818181 81818282 82828181 81818282 82818181 81818182 82828181 81818181 81818282 82828281 81818283 83848585 84838282 80808080 807f7f7f 7f7f7f7f 7f808080 80808080 7f7f7e7f 80828b8e 9da3afb3 b0ac9c96 827c716f 6e6e7171 72727171 71717171 73737475 75757575 75757676 77777878 7878797a 7b7c7c7d 7d7d7e*/

#pragma pack(1) //设置最小字节为1
typedef struct ECG1INFO{
    Byte ecg_filter; // 滤波方式 0:监护， 1:手术，2:诊断
    Byte ecg_gain; // 增益 0:0.25 倍，1:0.5 倍，2:1 倍，3:2 倍
    Byte ecg_stop; // 工频抑制, 50HZ、60HZ
    short hr; // 心率值,无效值为-100
    short hr_high; // 监护仪的报警上限
    short hr_low; // 监护仪的报警下限
    short hr_def_max; // 模块测量范围
    short hr_def_min;
    short st1; // st1 值,无效值为-100
    short st1_high; // 监护仪的报警上限
    short st1_low; // 监护仪的报警下限
    short st1_def_max; // 模块测量范围
    short st1_def_min;
    short st2; // st2 值,无效值为-100
    short st2_high; // 监护仪的报警上限
    short st2_low; // 监护仪的报警下限
    short st2_def_max; // 模块测量范围
    short st2_def_min;
    short pvc; // pvc 值,无效值为-100
    short pvc_high; // 监护仪的报警上限
    short pvc_def_max; // 模块测量范围
    Byte ecg_error_code; // 错误代码(当erro=0 时，值才有意义)
    Byte sound_status; // 状态
    Byte arr_error_code; // 心律失常代码
    Byte ecg1data[250]; // 1 通道心电波形。
}ECG1INFO;

// ECG2 数据包，类型0x21
typedef struct ECG2INFO{
    Byte ecg_filter; // 滤波方式 0:监护， 1:手术，2:诊断
    Byte ecg_gain; // 增益 0:0.25 倍，1:0.5 倍，2:1 倍，3:2 倍
    Byte ecg_stop; // 工频抑制, 50HZ、60HZ
    short hr; // 心率值,无效值为-100
    short hr_high; // 监护仪的报警上限
    short hr_low; // 监护仪的报警下限
    short hr_def_max; // 模块测量范围
    short hr_def_min;
    short st1; // st1 值,无效值为-100
    short st1_high; // 监护仪的报警上限
    short st1_low; // 监护仪的报警下限
    short st1_def_max; // 模块测量范围
    short st1_def_min;
    short st2; // st2 值,无效值为-100
    short st2_high; // 监护仪的报警上限
    short st2_low; // 监护仪的报警下限
    short st2_def_max; // 模块测量范围
    short st2_def_min;
    short pvc; // pvc 值,无效值为-100
    short pvc_high; // 监护仪的报警上限
    short pvc_def_max; // 模块测量范围
    Byte ecg_error_code; // 错误代码(当erro=0 时，值才有意义)
    Byte sound_status; // 状态
    Byte arr_error_code; // 心律失常代码
    Byte ecg2data[250]; // 1 通道心电波形。
}ECG2INFO;

// RESP 数据包，类型0x22
typedef struct RESPINFO{
     Byte resp_gain; // 增益 0:0.25 倍，1:0.5 倍，2:1 倍，3:2 倍
     short rr; // 呼吸率值,无效值为-100
     short rr_high; // 监护仪的报警上限
     short rr_low; // 监护仪的报警下限
     short rr_def_max; // 模块测量范围
     short rr_def_min;
     Byte resp_alarm; // 窒息报警秒(0 表示关闭, 10-40 秒)
     Byte resp_error_code; // 错误代码(当erro=0 时，值才有意义)
     Byte respdata[125]; // 1 通道呼吸波形。
}RESPINFO;

// 血氧数据包，类型0x0C
typedef struct SPO2INFO{
     short spo2; // 血氧值,无效值为-100
     short spo2_high; // 监护仪的报警上限
     short spo2_low; // 监护仪的报警下限
     short spo2_def_max; // 模块测量范围
     short spo2_def_min;
     short pr; // 脉率值,无效值为-100
     short pr_high; // 监护仪的报警上限
     short pr_low; // 监护仪的报警下限
     short pr_def_max; // 模块测量范围
     short pr_def_min;
     Byte spo2_error_code; // 错误代码(当erro=0 时，值才有意义)
     Byte sound_status; // 状态
     Byte wavedata[125]; // 波形数据
}SPO2INFO;

// 血压数据包，类型0x0D
typedef struct NIBPINFO{
     short sys; // 高压值,无效值为-100
     short sys_high; // 监护仪的报警上限
     short sys_low; // 监护仪的报警下限
     short sys_def_max; // 模块测量范围
     short sys_def_min;
     short mea; // 平均压值,无效值为-100
     short mea_high; // 监护仪的报警上限
     short mea_low; // 监护仪的报警下限
     short mea_def_max; // 模块测量范围
     short mea_def_min;
     short dia; // 低压值,无效值为-100
     short dia_high; // 监护仪的报警上限
     short dia_low; // 监护仪的报警下限
     short dia_def_max; // 模块测量范围
     short dia_def_min;
     ushort press; // 袖带实时压力值
     Byte measure; // 正在测试标志(TRUE：正在测量)
     Byte nibp_error_code; // 错误代码(对测量结果的状态)
     Byte nibp_mode; // 测量模式
     ushort timerCount; // 测量倒计计数器
}NIBPINFO;

// 体温数据包，类型0x0E
typedef struct TEMPINFO{
     short t1; // 体温1 值,无效值为-100
     short t1_high; // 监护仪的报警上限
     short t1_low; // 监护仪的报警下限
     short t1_def_max; // 模块测量范围
     short t1_def_min;
     short t2; // 体温2 值,无效值为-100
     short t2_high; // 监护仪的报警上限
     short t2_low; // 监护仪的报警下限
     short t2_def_max; // 测量范围
     short t2_def_min;
     Byte temp_error_code; // 错误代码(当erro=0 时，值才有意义)
}TEMPINFO;

//波形类型,长度
typedef struct WAVETYPE{
    Byte type;
    short length;
}WAVETYPE;

@interface MonitorModel : NSObject

@property (nonatomic, assign)PKGTYPE pkgType;

//@property(nonatomic, strong)NSData *hr1Data;//心率
//@property(nonatomic, strong)NSData *hr2Data;//心率
//@property(nonatomic, strong)NSData *rrData;//呼吸率
//@property(nonatomic, strong)NSData *spoData;//血氧

@property(nonatomic, strong)NSData *ecg1Data;//心率1
@property(nonatomic, strong)NSData *ecg2Data;//心率2
@property(nonatomic, strong)NSData *respData;//呼吸率
@property(nonatomic, strong)NSData *spo2Data;//血氧

@property (nonatomic, assign)int hr1;
@property (nonatomic, assign)int hr2;
@property (nonatomic, assign)int rr;
@property (nonatomic, assign)int spo;
@property (nonatomic, assign)int pr;
@property (nonatomic, assign)int sys;//高压
@property (nonatomic, assign)int mea;//平均血压
@property (nonatomic, assign)int dia;//低压
@property (nonatomic, assign)int t1;
@property (nonatomic, assign)int t2;

@end

@class SendWaveDataModel;
//发送的数据类型
@interface SendDataModel : MonitorModel
@property (nonatomic, strong)NSData *sendData;
@property (nonatomic, strong)SendWaveDataModel *waveDataModel;
- (id)initWithData:(NSData *)data type:(PKGTYPE)type waveDataModel:(SendWaveDataModel *)waveDataModel;
+ (id)modelWithData:(NSData *)data type:(PKGTYPE)type waveDataModel:(SendWaveDataModel *)waveDataModel;
- (id)initWithData:(NSData *)data type:(PKGTYPE)type;
+ (id)modelWithData:(NSData *)data type:(PKGTYPE)type;
@end

@interface SendWaveDataModel : SendDataModel

@end


